/**
 * clase que implementa la logica para la denunciar al usuario
 * @Enterprise sumset
 * @Date 22/02/2012
 * @author Deivid Arias*/
package com.sumset.backbeans;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;

import com.sumset.daos.DaoCategoriaDenuncia;
import com.sumset.daos.DaoComentario;
import com.sumset.daos.DaoDenuncia;
import com.sumset.daos.DaoPost;
import com.sumset.daos.DaoUsuario;
import com.sumset.entidades.CategoriaDenuncia;
import com.sumset.entidades.Comentario;
import com.sumset.entidades.Denuncia;
import com.sumset.entidades.Post;
import com.sumset.entidades.Usuario;
import com.sumset.variablesglobales.VariablesGLobales;

/**
 * Descripcion Clase: Clase donde se alojaran todas las funciones representativas de las paginas de las denuncias.
 * Responsabilidades: Atender y procesar todas las solicitudes de las paginas relacionadas con las denuncias.
 * Fecha Creacion: 13/02/2012
 * @author andres.
 * @author deivid.
 */
@SessionScoped
@ManagedBean
public class DenunciadoBean {

	// Atributos del usuario a denunciar.
	@EJB
	private DaoUsuario daoUsuario;
	private Usuario usuario;
	private String usuarioDenunciado;
	private Post post;
	private Integer postSeleccionado;
	@EJB
	private DaoPost daoPost;
	private Comentario comentario;
	@EJB
	private DaoComentario daoComentario;
	private Boolean estadoVariable = false;

	@EJB
	private DaoDenuncia daoDenuncia;
	@EJB
	private DaoCategoriaDenuncia daoCategoria;
	private String contenidoDenuncia;
	private String contenidoPost;
	private String mensajeDenuncia;
	private String estado = "Desactivado";
	private String estadoPost = "reportado";
	private String ruta = "C:\\Users\\andres\\Documents\\WSEclipse\\Taringaso\\src\\com\\sumset\\util\\LlamadasNoAtendidas.jasper";
	private String conexionBD = "jdbc:mysql://localhost:3306/taringaso";
	private String usuarioBD = "root";
	private String passwordBD = "12345";
	
	
	private static final Integer LISTA_POST=0;
	
	//Atriutos para el reporte.
	private HashMap parameters;
	private Connection con; 

	
	/**
	 * constructor del backend
	 */
	public DenunciadoBean() {
		super();
		postSeleccionado = 1;
	}

	/**
	 * Proposito del Metodo: buscar los usuarios que el denunciante reporte..
	 * Responsabilidades: Es responsable De obtener los cambios que se realizan sobre los campos
	 * necesarios de los usuarios a denunciar
	 * @return No aplica retorno.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No Aplica
	 * @exception No aplica*/
	public void buscarUsuario() {

		usuario = daoUsuario.buscar(usuarioDenunciado);
		mensajeDenuncia = null;
		contenidoPost = null;
		if (usuario != null) {

			if (usuario.getListaPosts().isEmpty()) {

				setMensajeDenuncia(VariablesGLobales.MENSAJE_USUARIO_NO_TIENE_POST);

			}

			else {

				post = usuario.getListaPosts().get(LISTA_POST);
				contenidoPost = post.getContenido();

			}

		}

		else {

			setMensajeDenuncia(VariablesGLobales.MENSAJE_USUARIO_DENUNCIADO);

		}
	}

	/**
	 * Proposito del Metodo: buscar el codigo que se elija desde la pagina.
	 * Responsabilidades: es responsable de obtener el codigo del post para utilizarlo
	 * en otra pagina 
	 * @return No aplica retorno.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param se captura el evento del post seleccionado
	 * @exception No aplica*/
	public void buscarPost(ValueChangeEvent event) {

		postSeleccionado = (Integer) event.getNewValue();
		post = daoPost.buscar(postSeleccionado);
		contenidoPost = post.getContenido();

	}

	/**
	 * Proposito del Metodo: listar los posts.
	 * Responsabilidades: mostrarlos en un combobox
	 * @return una lista de items que se mostraran en el combobos.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public List<SelectItem> getPosts() {

		List<SelectItem> item = new ArrayList<SelectItem>();

		if (usuario != null) {

			List<Post> posts = usuario.getListaPosts();

			for (Post cp : posts) {

				SelectItem s = new SelectItem(cp.getId(), cp.getTitulo());
				item.add(s);
			}
			return item;

		}

		else {

			return item;
		}

	}

	/**
	 * Proposito del Metodo: listar los comentarios dependiendo del usuario.
	 * Responsabilidades: mostrar en una tabla los comentarios.
	 * @return una lista de comentarios que se mostraran en la tabla.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public List<Comentario> getListaComentariosUsuario() {

		List<Comentario> listaComentariosNueva = new ArrayList<Comentario>();
		if (post != null) {

			List<Comentario> listaComentarios = post.getListaComentarios();
			for (Comentario comentario : listaComentarios) {

				if (comentario.getUsuario().getNickUser()
						.equals(usuario.getNickUser())) {

					listaComentariosNueva.add(comentario);

				}

			}

			return listaComentariosNueva;

		}else{

			return listaComentariosNueva;

		}

	}

	/**
	 * Proposito del Metodo: borrar comentarios.
	 * Responsabilidades: borrar el comentario que se denuncie.
	 * @return direcciona hacia la pagina de registrar la denuncia.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param comentario a denunciar
	 * @exception No aplica*/
	public String borrarComentario(Comentario c) {

		Comentario comentario = daoComentario.buscar(c.getId());
		comentario.setEstado(estado);

		return VariablesGLobales.RUTA_PAGINA_DENUNCIAR;

	}

	/**
	 * Proposito del Metodo: actualizar un comentario denunciado.
	 * Responsabilidades: cambiar el comentario anterior por uno nuevo.
	 * @return No aplica.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param Comentario a modificar
	 * @exception No aplica*/
	public void actualizarComentario(Comentario c) {

		Comentario comentario = daoComentario.buscar(c.getId());
		comentario.setContenido(c.getContenido());
		daoComentario.actualizar(comentario);

	}

	/**
	 * Proposito del Metodo: cancelar un post.
	 * Responsabilidades: cambiar el estado del post que se denuncie.
	 * @return No aplica.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public void cancelarPost() {

		post.setEstado(estadoPost);
		daoPost.actualizar(post);

	}

	/**
	 * Proposito del Metodo: actualizar el panel de la denuncia.
	 * Responsabilidades: modificar la visualizacion del panel de la denuncia.
	 * @return La misma pagina pero ya con el cambio realizado
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public String actualizarPanelDenuncia() {

		estadoVariable = true;
		return VariablesGLobales.RUTA_PAGINA_DENUNCIAR;

	}

	/**
	 * Proposito del Metodo: registrar una denuncia a cierto usuario.
	 * Responsabilidades: ingresar la denuncia al usuario solicitado por
	 * el denunciante.
	 * @return direccion hacia la pagina de las llamadas.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param No aplica
	 * @exception No aplica*/
	public String registrarDenuncia() {

		Denuncia denuncia = new Denuncia();
		LlamadaBean llamada = 
				(LlamadaBean) FacesContext.getCurrentInstance()
				.getExternalContext().getSessionMap()
				.get(VariablesGLobales.VARIABLE_EJB_LLAMADA);
		CategoriaDenuncia categoria = daoCategoria.buscar(llamada
				.getCategoriaSeleccionada());
		denuncia.setCategoriaDenuncia(categoria);
		denuncia.setPost(post);
		denuncia.setContenido(contenidoDenuncia);
		denuncia.setUsuario(usuario);
		daoDenuncia.insertar(denuncia);

		contenidoDenuncia = null;
		usuario = null;
		post = null;
		return VariablesGLobales.RUTA_PAGINA_MIS_LLAMADITAS;
	}

	/**
	 * Proposito del Metodo: generar un reporte.
	 * Responsabilidades: Mostrar un reporte que muestre
	 * todas las llamadas que no han sido atendidas.
	 * @return No aplica.
	 * @author Deivid.
	 * Fecha Creacion: No remember.
	 * @param Comentario a modificar
	 * @exception No aplica*/
	public void reporte() throws JRException, SQLException {
		String rutaReporte = ruta;

		con = DriverManager.getConnection(conexionBD, usuarioBD,
				passwordBD);

		parameters = new HashMap();

		JasperPrint jasperPrint = JasperFillManager.fillReport(rutaReporte, parameters,
				con);
		JasperViewer jviewer = new JasperViewer(jasperPrint, true);
		jviewer.show();
		con.close();
	}

	// Asignacion y obtencion de atributos
	public DaoUsuario getDaoUsuario() {
		return daoUsuario;
	}

	public void setDaoUsuario(DaoUsuario daoUsuario) {
		this.daoUsuario = daoUsuario;
	}

	public Post getPost() {
		return post;
	}

	public void setPost(Post post) {
		this.post = post;
	}

	public Integer getPostSeleccionado() {
		return postSeleccionado;
	}

	public void setPostSeleccionado(Integer postSeleccionado) {
		this.postSeleccionado = postSeleccionado;
	}

	public DaoPost getDaoPost() {
		return daoPost;
	}

	public void setDaoPost(DaoPost daoPost) {
		this.daoPost = daoPost;
	}

	public Comentario getComentario() {
		return comentario;
	}

	public void setComentario(Comentario comentario) {
		this.comentario = comentario;
	}

	public DaoComentario getDaoComentario() {
		return daoComentario;
	}

	public void setDaoComentario(DaoComentario daoComentario) {
		this.daoComentario = daoComentario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public String getContenidoPost() {
		return contenidoPost;
	}

	public void setContenidoPost(String contenidoPost) {
		this.contenidoPost = contenidoPost;
	}

	public String getUsuarioDenunciado() {
		return usuarioDenunciado;
	}

	public void setUsuarioDenunciado(String usuarioDenunciado) {
		this.usuarioDenunciado = usuarioDenunciado;
	}

	public Boolean getEstadoVariable() {
		return estadoVariable;
	}

	public void setEstadoVariable(Boolean estadoVariable) {
		this.estadoVariable = estadoVariable;
	}

	public String getContenidoDenuncia() {
		return contenidoDenuncia;
	}

	public void setContenidoDenuncia(String contenidoDenuncia) {
		this.contenidoDenuncia = contenidoDenuncia;
	}

	public String getMensajeDenuncia() {
		return mensajeDenuncia;
	}

	public void setMensajeDenuncia(String mensajeDenuncia) {
		this.mensajeDenuncia = mensajeDenuncia;
	}

	public DaoDenuncia getDaoDenuncia() {
		return daoDenuncia;
	}

	public void setDaoDenuncia(DaoDenuncia daoDenuncia) {
		this.daoDenuncia = daoDenuncia;
	}

	public DaoCategoriaDenuncia getDaoCategoria() {
		return daoCategoria;
	}

	public void setDaoCategoria(DaoCategoriaDenuncia daoCategoria) {
		this.daoCategoria = daoCategoria;
	}

	public HashMap getParameters() {
		return parameters;
	}

	public void setParameters(HashMap parameters) {
		this.parameters = parameters;
	}

	public Connection getCon() {
		return con;
	}

	public void setCon(Connection con) {
		this.con = con;
	}
	
}
